package repository

import (
	"gorm.io/gorm"

	"podSrv/domain/model"
)

// 创建需要实现的接口
type IPodRepository interface {
	// 初始化表
	InitTable() error
	// 根据 ID 查处找数据
	FindPodByID(int64) (*model.Pod, error)
	// 创建一条 Pod 数据
	CreatePod(*model.Pod) (int64, error)
	// 根据 ID 删除一条 Pod 数据
	DeletePodByID(int64) error
	// 修改一条数据
	UpdatePod(*model.Pod) error
	// 查找 Pod 所有数据
	FindPodList(page *model.Page) (int64, []model.Pod, error)
}

type PodRepository struct {
	mysqlDb *gorm.DB
}

// 创建 PodRepository
func NewPodRepository(db *gorm.DB) IPodRepository {
	return &PodRepository{mysqlDb: db}
}

// 初始化表
func (p *PodRepository) InitTable() error {
	return p.mysqlDb.AutoMigrate(&model.Pod{}, &model.PodEnv{}, &model.PodPort{})
}

// 根据 ID 查找 Pod 信息
func (p *PodRepository) FindPodByID(podID int64) (pod *model.Pod, err error) {
	pod = &model.Pod{}
	return pod, p.mysqlDb.Preload("PodEnv").Preload("PodPort").First(pod, podID).Error
}

// 创建 Pod 信息
func (p *PodRepository) CreatePod(pod *model.Pod) (int64, error) {
	return pod.ID, p.mysqlDb.Create(pod).Error
}

// 根据 ID 删除 Pod 信息
func (p *PodRepository) DeletePodByID(podID int64) error {
	tx := p.mysqlDb.Begin()
	//遇到问题回滚
	defer func() {
		if err := recover(); err != nil {
			tx.Rollback()
		}
	}()
	if tx.Error != nil {
		return tx.Error
	}

	//删除 POD 信息
	if err := tx.Where("id = ?", podID).Delete(&model.Pod{BaseModel: model.BaseModel{ID: podID}}).Error; err != nil {
		tx.Rollback()
		return err
	}
	//删除 podenv 信息
	if err := tx.Where("pod_id = ?", podID).Delete(&model.PodEnv{PodID: podID}).Error; err != nil {
		tx.Rollback()
		return err
	}
	//删除 podport 信息
	if err := tx.Where("pod_id = ?", podID).Delete(&model.PodPort{PodID: podID}).Error; err != nil {
		tx.Rollback()
		return err
	}
	return tx.Commit().Error
}

// 更新 Pod 信息
func (p *PodRepository) UpdatePod(pod *model.Pod) error {
	tx := p.mysqlDb.Begin()
	//遇到问题回滚
	defer func() {
		if err := recover(); err != nil {
			tx.Rollback()
		}
	}()
	if tx.Error != nil {
		return tx.Error
	}

	if err := tx.Model(&pod).Updates(pod).Error; err != nil {
		tx.Rollback()
		return err
	}
	for _, port := range pod.PodPort {
		if err := tx.Model(&port).Save(port).Error; err != nil {
			tx.Rollback()
			return err
		}
	}
	for _, env := range pod.PodEnv {
		if err := tx.Model(&env).Save(env).Error; err != nil {
			tx.Rollback()
			return err
		}
	}
	return tx.Commit().Error
}

// 获取结果集
func (p *PodRepository) FindPodList(page *model.Page) (total int64, podList []model.Pod, err error) {
	if result := p.mysqlDb.Model(&model.Pod{}).Count(&total); result.Error != nil {
		return total, podList, err
	}
	return total, podList, p.mysqlDb.Model(&model.Pod{}).Preload("PodPort").Preload("PodEnv").Scopes(Paginate(page)).Find(&podList).Error
}
